package edu.sdbi.judge.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import edu.sdbi.judge.domain.entity.NewsType;
import edu.sdbi.judge.domain.vo.StudentResult;
import edu.sdbi.judge.mapper.NewsTypeMapper;
import edu.sdbi.judge.service.GetJudgeIpResultService;
import edu.sdbi.judge.util.HttpUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 新闻分类列表
 *
 * @author 周涛
 */
@Order(2)
@Service
public class Judge_2 implements GetJudgeIpResultService {
    private static final Logger logger = LoggerFactory.getLogger(Judge_2.class);

    @Autowired
    private HttpUtil httpUtil;

    @Autowired
    private NewsTypeMapper newsTypeMapper;

    @Override
    public StudentResult getJudgeIpResult(String ip) {
        StudentResult studentResult = new StudentResult();
        studentResult.setItemNumber("2");

        try {
            // 步骤1: 调用接口获取新闻类型列表
            String result = httpUtil.doGet("http://" + ip + "/newsType/list", null, null);

            // 解析接口返回结果
            JSONObject json = JSONObject.parseObject(result);

            // 验证接口返回状态
            if (json.getIntValue("code") != 200) {
                studentResult.setScore(0.0);
                studentResult.setResult("接口返回状态码错误：" + json.getIntValue("code"));
                return studentResult;
            }

            // 获取接口返回的新闻类型数据
            JSONArray dataArray = json.getJSONArray("data");
            if (dataArray == null || dataArray.isEmpty()) {
                studentResult.setScore(0.0);
                studentResult.setResult("未返回新闻分类数据");
                return studentResult;
            }

            // 步骤2: 从数据库获取新闻类型数据
            List<NewsType> dbNewsTypes = newsTypeMapper.selectAll();

            if (dbNewsTypes == null || dbNewsTypes.isEmpty()) {
                studentResult.setScore(0.0);
                studentResult.setResult("数据库中未找到新闻分类数据");
                return studentResult;
            }

            // 步骤3: 验证接口返回的数据与数据库中的数据是否一致
            // 3.1 验证数量是否一致
            if (dataArray.size() != dbNewsTypes.size()) {
                studentResult.setScore(0.0);
                studentResult.setResult("接口返回的新闻分类数量(" + dataArray.size() +
                        ")与数据库中的数量(" + dbNewsTypes.size() + ")不一致");
                return studentResult;
            }

            // 3.2 验证每个新闻类型的数据是否一致
            for (Object obj : dataArray) {
                JSONObject item = (JSONObject) obj;
                String typeId = item.getString("id");
                String typeName = item.getString("name");

                // 检查字段完整性
                if (typeId == null || typeName == null) {
                    studentResult.setScore(0.0);
                    studentResult.setResult("新闻分类字段不完整");
                    return studentResult;
                }

                // 从数据库中查找对应的新闻类型
                NewsType dbNewsType = null;
                for (NewsType newsType : dbNewsTypes) {
                    if (typeId.equals(newsType.getId())) {
                        dbNewsType = newsType;
                        break;
                    }
                }

                // 验证数据库中是否存在该新闻类型
                if (dbNewsType == null) {
                    studentResult.setScore(0.0);
                    studentResult.setResult("接口返回的新闻分类ID(" + typeId + ")在数据库中不存在");
                    return studentResult;
                }

                // 验证新闻类型名称是否一致
                if (!typeName.equals(dbNewsType.getName())) {
                    studentResult.setScore(0.0);
                    studentResult.setResult("新闻分类ID(" + typeId + ")的名称与数据库不一致: " +
                            "接口返回[" + typeName + "], 数据库中为[" + dbNewsType.getName() + "]");
                    return studentResult;
                }
            }

            // 全部验证通过
            studentResult.setScore(2.0);
            studentResult.setResult("查询所有新闻分类列表成功，且数据与数据库一致");

        } catch (Exception e) {
            logger.error("调用接口异常", e);
            studentResult.setScore(0.0);
            studentResult.setResult("接口调用异常：" + e.getMessage());
        }

        return studentResult;
    }
}